#include "tab1.h"
#include "imgui.h"
#include "loc/loc.h"
#include "mgr.h"
#include "tab1-lua.h"
#include <fstream>
#include <iostream>

using namespace std;

bool is_init = false;
static bool show_is_init = false;
extern ImVec2 btn_size;
static bool show_sign_loc = false;
extern ImVec4 success_color;

void tab1() {
  init();

  ImGui::BeginDisabled(!is_init);
  script_execute();
  script_suspend();
  script_resume();
  script_stop();
  if (ImGui::CollapsingHeader("初始化信息")) {
    init_msg();
  }
  // if (ImGui::CollapsingHeader("功能")) {
  //   fishing();
  // }
  ImGui::EndDisabled();
  if (ImGui::CollapsingHeader("调试")) {
    sign_loc();
    if (ImGui::Button("保存 Item Type 缓存")) {
      api()->save_item_type_cache();
    }
  }
}

void init() {
  ImGui::BeginDisabled(is_init);
  if (ImGui::Button("初始化游戏数据", ImVec2(btn_size.x * 2, btn_size.y))) {
    auto core_base = game()->get_gs58();
    game()->set_core_base(core_base);
    dbgprintu8("codergege [%s][%03d] core_base: 0x%llX\n", __FUNCTION__,
               __LINE__, game()->core_base());
    api()->load_item_type_cache();
    is_init = true;
    show_is_init = true;
  }
  ImGui::EndDisabled();
  if (show_is_init) {
    ImGui::SameLine();
    ImGui::TextColored(success_color, "初始化完成");
  }
}

void init_msg() {
  if (show_is_init) {
    ImGui::Text("GS:[58] = 0x%llX", Mgr::get()->game()->core_base());
  }
  ImGui::Text("pid=0x%X(%d)", Mgr::get()->pid(), Mgr::get()->pid());
  ImGui::Text("game_window=0x%X(%d)", Mgr::get()->window(),
              Mgr::get()->window());
  ImGui::Text("game_module_base=%llX", Mgr::get()->base());
}

// FIXME: 有bug, 过一段时间后, 识别不到鱼漂
// std::atomic<bool> is_fishing{false};
// std::atomic<bool> keep_thread_running{false};
// std::thread fishing_thread;

// void run_fishing_logic() {
//   dbgprintu8("codergege [%s][%03d] 钓鱼线程已启动\n", __FUNCTION__,
//   __LINE__); while (keep_thread_running) {
//     if (is_fishing) {
//       // 在这里实现你的钓鱼逻辑
//       std::this_thread::sleep_for(std::chrono::seconds(1));
//       game()->macro("/cast 钓鱼");
//       std::this_thread::sleep_for(std::chrono::seconds(2));
//       auto fish_float = api()->get_ground("鱼漂");
//       if (fish_float == nullptr) {
//         dbgprintu8("codergege [%s][%03d] 没有找到鱼漂，跳过本轮循环。\n",
//                    __FUNCTION__, __LINE__);
//         continue;
//       }
//
//       bool bait_found{false};
//       // 15s
//       for (auto i : views::iota(0, 15 * 10)) {
//         std::this_thread::sleep_for(std::chrono::milliseconds(100));
//         if (!is_fishing.load()) {
//           dbgprintu8("用户取消钓鱼，提前退出等待循环。\n");
//           break; // 立即跳出 for 循环
//         }
//         if (fish_float->bait_state() == 3) {
//           bait_found = true;
//           break;
//         }
//       }
//       if (bait_found && is_fishing.load()) {
//         game()->select(fish_float->id1(), fish_float->id2(), 4);
//         std::this_thread::sleep_for(std::chrono::seconds(1));
//       }
//       // 无论收杆与否，执行完一轮后，如果 is_fishing 还是
//       // true，休息一下准备下一轮
//       if (is_fishing.load()) {
//         std::this_thread::sleep_for(std::chrono::seconds(2)); //
//         避免无限速循环
//       }
//     } else {
//       // 如果 is_fishing 为 false，稍微休息一下，避免占用过多 CPU
//       std::this_thread::sleep_for(std::chrono::milliseconds(1000));
//     }
//   }
//   dbgprintu8("codergege [%s][%03d] 钓鱼线程已停止\n", __FUNCTION__,
//   __LINE__);
// }

// void fishing() {
//   static bool logic_is_fishing{false};
//   // Checkbox 仍然控制 atomic 变量
//   ImGui::Checkbox("启动/停止钓鱼", &logic_is_fishing);
//   is_fishing.store(logic_is_fishing);
//
//   // 确保钓鱼逻辑线程在程序生命周期内运行
//   // 你可以在程序启动时一次性启动它，或者像下面这样管理：
//   if (!fishing_thread.joinable()) {
//     keep_thread_running = true;
//     fishing_thread = std::thread(run_fishing_logic);
//   }
//
//   // 界面显示状态
//   if (is_fishing.load()) {
//     ImGui::SameLine();
//     ImGui::Text("状态：正在钓鱼...");
//     ImGui::SameLine();
//     // auto ff = api()->get_ground("鱼漂");
//     // if (ff != nullptr) {
//     //   ImGui::Text("上钩状态[%d]", ff->bait_state());
//     // }
//   } else {
//     ImGui::SameLine();
//     ImGui::Text("状态：空闲。");
//   }
//
//   //
//   注意：在应用程序退出前，你需要确保调用以下代码来清理线程，否则程序会崩溃：
//   // keep_thread_running = false;
//   // if (fishing_thread.joinable()) {
//   //     fishing_thread.join();
//   // }
// }

void sign_loc() {
  if (ImGui::Button("特征码定位")) {
    auto content = locate(Mgr::get()->pid());
    const string &file_string{
        "D:\\workspace\\games\\wow-classic\\game\\src\\loc\\rva.h"};
    ofstream OsWrite(file_string, ofstream::trunc);
    OsWrite << content;
    OsWrite << endl;
    OsWrite.close();
    show_sign_loc = true;
  }
  if (show_sign_loc) {
    ImGui::SameLine();
    ImGui::TextColored(success_color, "特征码定位完成");
    ImGui::SameLine();
    if (ImGui::Button("关闭", btn_size)) {
      show_sign_loc = false;
    }
  }
}
